package com.example.copa_america.dao;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import android.os.AsyncTask;
import android.util.Log;

import com.example.copa_america.model.Sede;

public class DataService {
	private static final String TAG_CAT = "DataService";
	private static final String ENCODING = "ISO-8859-1";

	// Constructor.
	public DataService() {
	}

	public ArrayList<Sede> getSedes(String url) {
		Log.d(TAG_CAT, "Se pasa la url:" + url + " a CargarSedesBackground");
		ArrayList<Sede> sedes = null;
		CargarSedesBackground cargadorSignals = new CargarSedesBackground();
		cargadorSignals.execute(url);
		try {
			sedes = cargadorSignals.get();
		} catch (InterruptedException e) {
			Log.i(TAG_CAT, e.toString());
		} catch (ExecutionException e) {
			Log.i(TAG_CAT, e.toString());
		}
		if (sedes != null) {
			Log.d(TAG_CAT, "CARGA OK");
		} else {
			Log.d(TAG_CAT, "CARGA MALA no parseo");
		}
		return sedes;
	}

	/**
	 * Clase que obtiene sedes desde una url fuente en segundo plano.
	 */
	private class CargarSedesBackground extends
			AsyncTask<String, Void, ArrayList<Sede>> {

		@Override
		protected ArrayList<Sede> doInBackground(String... params) {
			Log.d(TAG_CAT, "CargarSignalsBackground SAX PARSER");
			SAXParserFactory spf;
			SAXParser sp = null;
			XMLReader xr = null;
			URL sourceURL = null;
			InputSource is = null;
			ParserSedes myXMLHandler;
			boolean parserState = false;

			// Creando instancia de SAXParserFactory.
			spf = SAXParserFactory.newInstance();

			// Instancia de ParserSegnals.
			myXMLHandler = new ParserSedes();

			// Creando instancia de SAXParser.
			try {
				sp = spf.newSAXParser();
				// XMLReader.
				try {
					xr = sp.getXMLReader();
					// Nuerva instancia de sourceURL.
					try {
						sourceURL = new URL(params[0]);
						// Borrar, solo muestra en logcat el fichero a parsear.
						Log.d(TAG_CAT, sourceURL.toString());
						// Obtencion de InputSource.
						try {
							is = new InputSource(sourceURL.openStream());
							try {
								if (is != null) {
									is.setEncoding(ENCODING);
									// Seteo de Content Handler.
									xr.setContentHandler(myXMLHandler);
									// Parseo de XML.
									xr.parse(is);
									// Parseo efectuardo.
									parserState = true;
								}
							} catch (IOException e) {
								Log.i(TAG_CAT, e.toString());
							} catch (SAXException e) {
								Log.i(TAG_CAT, e.toString());
							}

						} catch (IOException e) {
							Log.i(TAG_CAT, e.toString());
						}

					} catch (MalformedURLException e) {
						Log.i(TAG_CAT, e.toString());
					}
				} catch (SAXException e) {
					Log.i(TAG_CAT, e.toString());
				}
			} catch (ParserConfigurationException e) {
				Log.i(TAG_CAT, e.toString());
			} catch (SAXException e) {
				Log.i(TAG_CAT, e.toString());
			}

			// Si el parseo se efectuo se obtienen las sedes y se retornan.
			if (parserState) {
				ArrayList<Sede> sedes = ParserSedes.getArraysedes();
				if (sedes != null && sedes.size() > 0) {
					// Borrar ciclo, solo muestra resultados en consola
					// (logcat).
					for (int i = 0; i < sedes.size(); i++) {
						Log.d(TAG_CAT, sedes.get(i).getNombre());
						Log.d(TAG_CAT, sedes.get(i).getCapacidad() );
						Log.d(TAG_CAT, sedes.get(i).getEstadio());
						
					}
					return sedes;
				}
			}
			return null;
		}

	}

}
